package com.px.project.module.ml.service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.px.project.module.ml.dto.storage.StorageDto;
import com.px.project.module.ml.entity.StorageDetail;
import com.px.project.module.ml.vo.storage.StorageDetailVo;
import com.px.project.module.ml.vo.storage.StorageVo;

import com.baomidou.mybatisplus.extension.service.IService;

import cn.hutool.core.date.DateTime;

/**
 * 入库单明细 服务类
 *
 * @author 品讯科技
 * @since 2023-11-29
 */
public interface IStorageDetailService extends IService<StorageDetail> {

    /**
     * 获取存储详细信息 VO
     *
     * @param storageId 存储 ID
     * @return {@link List }<{@link StorageDetailVo }>
     * @author 品讯科技
     * @date 2024-08
     */
    List<StorageDetailVo> getStorageDetailVo(Long storageId);

    /**
     * 保存存储详细信息
     *
     * @param dto DTO
     * @param isDraft 是否草稿
     * @return boolean
     * @author 品讯科技
     * @date 2024-08
     */
    boolean saveStorageDetail(StorageDto dto,Boolean isDraft);

    /**
     * 更新存储详细信息
     *
     * @param dto DTO
     * @param isDraft 是否草稿
     * @return boolean
     * @author 品讯科技
     * @date 2024-08
     */
    boolean updateStorageDetail(StorageDto dto,Boolean isDraft);

    /**
     * 更新库存
     *
     * @param storageVo 存储 VO
     * @return boolean
     * @author 品讯科技
     * @date 2024-08
     */
    boolean updateStock(StorageVo storageVo);

    /**
     * 根据型号ID，获取当月入库量
     *
     * @param materialId 物料ID
     * @param modelId 型号ID
     * @param lastMonthStartDate 年月日
     * @param lastMonthEndDate 年月日
     * @return BigDecimal
     */
    BigDecimal findSpendingPurchase(Long materialId, Long modelId, DateTime lastMonthStartDate, DateTime lastMonthEndDate);

    /**
     * 根据型号ID，获取累计入库量
     *
     * @param materialId 物料ID
     * @param modelId 型号ID
     * @param lastMonthDate 年月日
     * @return BigDecimal
     */
    BigDecimal findAggregatePurchase(Long materialId, Long modelId, DateTime lastMonthDate);

    /**
     * 获取上期盘库量
     * 
     * @param materialId 物资ID
     * @param modelId 型号ID
     * @param verificationDate 核销日期
     * @return BigDecimal
     */
    BigDecimal findSpendingInventory(Long materialId, Long modelId, Date verificationDate);

    /**
     * 根据型号ID，获取本期库存量
     *
     * @param materialId 物料ID
     * @param modelId 型号ID
     * @param year 年
     * @param month 月
     * @return BigDecimal
     */
    BigDecimal findSpendingStock(Long materialId, Long modelId, Integer year, Integer month);

    /**
     * 查询入库量
     *
     * @param beginDate 开始时间
     * @param endDate 结束时间
     * @return Integer
     */
    Integer getStorageCount(DateTime beginDate, DateTime endDate);
}
